package qc.module.iot.service.producer;

import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.client.producer.SendStatus;
import org.apache.rocketmq.spring.core.RocketMQTemplate;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import qc.common.core.constants.IotConstant;
import qc.common.core.unify.QCUnifyReturnValue;
import qc.module.iot.dto.MqIotPacketsMessageDto;

/**
 * Iot数据帧报文发送至MQ生产者Producer，只管发送消息，不管消息是否发送至MQ
 *
 * @author QuCheng Tech
 * @since 2025/10/26
 */
@Service
public class IotFramePacketsProducer {
    private static final Logger logger = LoggerFactory.getLogger(IotFramePacketsProducer.class);

    @Autowired
    private RocketMQTemplate rocketMQTemplate;

    /**
     * 消息队列中原始报文主题名称
     */
    private static final String MQ_FramePackets_Topic = IotConstant.MQ_FRAME_PACKETS_TOPIC;

    /**
     * 同步发送单条原始数据消息
     *
     * @param data 原始数据
     * @return 发送结果，成功返回null，失败返回错误信息
     */
    public String syncSend(MqIotPacketsMessageDto data) {
        //定义返回结果，默认为是成功
        String result = QCUnifyReturnValue.Success();

        try {
            // 同步发送消息
            SendResult sendResult = rocketMQTemplate.syncSend(MQ_FramePackets_Topic, data);
            SendStatus sendStatus = sendResult.getSendStatus();
            //根据发送至消息队列的结果进行判断，如果发送成功则返回成功（后续的数据处理和保存至数据库均由对应消费者进行），如果发送失败则需要再次直接调用保存到原始数据库方法
            if (sendStatus == SendStatus.SEND_OK) {
                logger.debug("发送Iot数据帧报文至MQ消息成功");
                //发送至MQ成功
            } else {
                //发送至MQ失败
                result = sendStatus.name();

                logger.warn("发送Iot数据帧报文至MQ消息失败，发送消息结果状态: {}", sendStatus);
            }
        } catch (Exception ex) {
            result = "发送Iot数据帧报文至MQ消息异常，" + ex.getMessage();

            logger.error("发送Iot数据帧报文至MQ消息异常", ex);
        }
        return result;
    }
}
